Skip to content

refactor(frontend): link-refactor #64

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 30, 2025
Merged

Conversation

tractorss
Copy link
Contributor

@tractorss tractorss commented Jan 30, 2025

Summary by CodeRabbit

  • New Features

    • Introduced a new CustomLink component to replace standard Link components across multiple frontend components
    • Added custom link handling with improved external link security
  • Refactoring

    • Replaced next/link imports with custom CustomLink component in numerous components
    • Simplified link rendering by removing explicit target and rel attributes
    • Standardized link behavior across the application
  • Improvements

    • Enhanced link security and performance through custom link implementation
    • Centralized link handling logic in a single CustomLink component

Copy link
Contributor

coderabbitai bot commented Jan 30, 2025

Walkthrough

The pull request introduces a comprehensive replacement of the standard Next.js Link component with a custom CustomLink component across multiple frontend files. This modification involves creating a new CustomLink.tsx component that extends the functionality of the original Link component, with added logic for handling external links. The changes span various components, including Hero sections, Navbar, Community, and other UI elements, systematically replacing Link with the new CustomLink implementation.

Changes

File Path Change Summary
frontend/src/components/CustomLink.tsx New custom link component with external link handling logic
frontend/src/components/Footer.tsx, frontend/src/components/Navbar/* Replaced Link with CustomLink for navigation elements
frontend/src/app/home/components/*, frontend/src/components/Community/* Substituted Link with CustomLink in Hero and community-related components
frontend/src/components/Earn/TabSection/* Updated link handling in Earn and Juror tab content sections

Poem

🐰 A Rabbit's Ode to Custom Links

Hop, hop, through code so bright,
Links now dance with custom might
No more plain old next/link,
Our CustomLink makes browsers wink! 🌐
Secure and swift, our rabbit's delight! 🚀

Possibly related PRs

Suggested reviewers

  • alcercu

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @coderabbitai title anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

netlify bot commented Jan 30, 2025

Deploy Preview for kleros-website-v2 ready!

Name Link
🔨 Latest commit 7d682b4
🔍 Latest deploy log https://app.netlify.com/sites/kleros-website-v2/deploys/679b590104d1a100082a01dc
😎 Deploy Preview https://deploy-preview-64--kleros-website-v2.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (8)
frontend/src/components/CustomLink.tsx (1)

19-19: Enhance external URL detection.

The current regex only checks for http/https protocols. Consider handling other cases:

-const isExternal = (url: string) => /^https?:\/\//.test(url);
+const isExternal = (url: string) => {
+  if (!url) return false;
+  try {
+    // Handle relative URLs that start with //
+    const urlString = url.startsWith('//') ? `https:${url}` : url;
+    const urlObj = new URL(urlString, window.location.origin);
+    return urlObj.origin !== window.location.origin;
+  } catch {
+    return false;
+  }
+};
frontend/src/components/PNKToken/BuySection/Exchanges.tsx (1)

15-23: Add aria-label for better accessibility.

While the implementation is correct, consider adding an aria-label to improve accessibility:

 <CustomLink href={exchange.url} key={exchange.name}>
+  <div aria-label={`Buy on ${exchange.name}`}>
     <Image
       width={64}
       height={64}
       src={exchange.icon.url}
       alt={exchange.name}
       className={hoverEffect}
     />
+  </div>
 </CustomLink>
frontend/src/components/IntegrateSection/LearnMore.tsx (1)

Line range hint 16-30: Consider using semantic HTML for the learn more link.

While the implementation works, consider using semantic HTML to improve structure:

 <CustomLink
   href={integrateData.arrowLink.link.url}
-  className="mt-16 block text-center"
+  className="mt-16 inline-flex items-center justify-center w-full"
 >
-  <span className="mr-4 text-lg text-primary-blue">
+  <span className="text-lg text-primary-blue">
     {integrateData.arrowLink.text}
   </span>
   <Image
     src={LinkArrow}
     width="24"
     height="24"
     alt="Arrow link image"
-    className="inline"
+    className="ml-4"
   />
 </CustomLink>

This improves:

  1. Semantic structure using flex layout
  2. Spacing consistency using margin-left on the icon
  3. Removes redundant inline class as flex handles alignment
frontend/src/components/PNKToken/Hero.tsx (1)

8-8: Use absolute import path for consistency.

Other files in the codebase use the absolute import path @/components/CustomLink. Consider updating for consistency:

-import CustomLink from "../CustomLink";
+import CustomLink from "@/components/CustomLink";
frontend/src/components/Community/hero.tsx (1)

8-8: Use absolute import path for consistency.

Other files in the codebase use the absolute import path @/components/CustomLink. Consider updating for consistency:

-import CustomLink from "../CustomLink";
+import CustomLink from "@/components/CustomLink";
frontend/src/components/ForBuilders/Hero.tsx (1)

Line range hint 30-39: Consider enhancing arrow link accessibility.

While the implementation is functionally correct, consider adding aria-label or title attributes to provide better context for screen readers, especially for the arrow image links.

-            <CustomLink key={arrowLink.text} href={arrowLink.link.url}>
+            <CustomLink 
+              key={arrowLink.text} 
+              href={arrowLink.link.url}
+              aria-label={`${arrowLink.text} - opens in new tab`}
+            >
frontend/src/app/home/components/Hero.tsx (1)

29-33: Consider extracting button link patterns into reusable components.

The component has multiple similar button-link patterns that could be extracted for better maintainability.

Consider creating a reusable ButtonLink component:

interface ButtonLinkProps {
  href: string;
  text: string;
  variant?: 'primary' | 'secondary';
  className?: string;
}

const ButtonLink: React.FC<ButtonLinkProps> = ({
  href,
  text,
  variant = 'primary',
  className
}) => (
  <CustomLink href={href}>
    <Button variant={variant}>
      <span className={className}>{text}</span>
    </Button>
  </CustomLink>
);

This would simplify the Hero component and make it more maintainable.

Also applies to: 36-40, 43-52

frontend/src/components/Earn/TabSection/CuratorTabContent/KlerosScoutSection.tsx (1)

47-52: Consider moving styling classes to the Button component.

The z-index and margin classes could be moved to the Button component for better separation of concerns, as they appear to be specific to the button's positioning rather than the link's behavior.

Consider this improvement:

-        <CustomLink
-          href={learnMoreButton.link.url}
-          className="z-[1] mt-16 md:mt-0"
-        >
-          <Button className="text-background-1">{learnMoreButton.text}</Button>
-        </CustomLink>
+        <CustomLink href={learnMoreButton.link.url}>
+          <Button className="z-[1] mt-16 md:mt-0 text-background-1">
+            {learnMoreButton.text}
+          </Button>
+        </CustomLink>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 40c08db and 7d682b4.

📒 Files selected for processing (34)
  • frontend/src/app/for-lawyers/components/Hero.tsx (2 hunks)
  • frontend/src/app/home/components/Hero.tsx (3 hunks)
  • frontend/src/app/home/components/LearnPosts.tsx (2 hunks)
  • frontend/src/app/home/components/TrustedBy.tsx (2 hunks)
  • frontend/src/components/BrandAssets/Hero.tsx (2 hunks)
  • frontend/src/components/BrandAssets/LogosPackageSection.tsx (2 hunks)
  • frontend/src/components/Community/CommunityCard.tsx (2 hunks)
  • frontend/src/components/Community/hero.tsx (2 hunks)
  • frontend/src/components/Cooperative/ReportSection/ReportCard.tsx (2 hunks)
  • frontend/src/components/Cooperative/hero.tsx (2 hunks)
  • frontend/src/components/CtaBox.tsx (2 hunks)
  • frontend/src/components/CustomLink.tsx (1 hunks)
  • frontend/src/components/Earn/TabSection/CuratorTabContent/KlerosScoutSection.tsx (2 hunks)
  • frontend/src/components/Earn/TabSection/JurorTabContent/CourtsSection.tsx (3 hunks)
  • frontend/src/components/Earn/TabSection/JurorTabContent/EnterCourtSection.tsx (2 hunks)
  • frontend/src/components/ExternalLink.tsx (2 hunks)
  • frontend/src/components/Footer.tsx (2 hunks)
  • frontend/src/components/ForBuilders/Hero.tsx (3 hunks)
  • frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/HowKlerosSolvesIt.tsx (3 hunks)
  • frontend/src/components/ForBuilders/UseCasesSection/DAOSection/LearnMore.tsx (3 hunks)
  • frontend/src/components/IntegrateSection/LearnMore.tsx (2 hunks)
  • frontend/src/components/LearnMore.tsx (2 hunks)
  • frontend/src/components/Navbar/AppsDropdownContent/Card.tsx (3 hunks)
  • frontend/src/components/Navbar/AppsDropdownContent/index.tsx (3 hunks)
  • frontend/src/components/Navbar/MobileMenu.tsx (2 hunks)
  • frontend/src/components/Navbar/ResourcesDropdownContent/index.tsx (4 hunks)
  • frontend/src/components/Navbar/index.tsx (2 hunks)
  • frontend/src/components/PNKToken/BuySection/Exchanges.tsx (2 hunks)
  • frontend/src/components/PNKToken/BuySection/FeaturedExchange.tsx (3 hunks)
  • frontend/src/components/PNKToken/Explorers.tsx (3 hunks)
  • frontend/src/components/PNKToken/Hero.tsx (2 hunks)
  • frontend/src/components/ResearchDevelopment/Hero.tsx (2 hunks)
  • frontend/src/components/ResearchDevelopment/TabSection/FellowshipTabContent/Testimonials/TestimonialCard.tsx (2 hunks)
  • frontend/src/components/ResearchDevelopment/TabSection/ResearchTabContent/KlerosBook.tsx (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: Redirect rules - kleros-website-v2
  • GitHub Check: Header rules - kleros-website-v2
  • GitHub Check: Pages changed - kleros-website-v2
🔇 Additional comments (41)
frontend/src/components/PNKToken/Explorers.tsx (2)

5-5: Verify the CustomLink component import path

The relative import path suggests CustomLink is in a parent directory. Let's verify its existence and location.

✅ Verification successful

Import path for CustomLink component is correct

The relative import path "../CustomLink" correctly resolves to frontend/src/components/CustomLink.tsx from the current file location.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the existence and location of CustomLink component
# Expected: Find the CustomLink component relative to the current file

# Get the component location
fd -e tsx -e ts "CustomLink" frontend/src/components/

Length of output: 92


Line range hint 15-26: LGTM! Verify external URL handling

The CustomLink implementation looks correct. Since these are links to external token explorers, let's verify that CustomLink handles external URLs appropriately (e.g., opens in new tab with proper security attributes).

✅ Verification successful

External URL handling in CustomLink is properly implemented

The CustomLink component correctly handles external URLs by:

  • Opening them in a new tab
  • Including proper security attributes (rel="noopener noreferrer")
  • Correctly detecting external URLs via http/https pattern
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify CustomLink implementation for external URLs
# Expected: Find proper handling of external URLs in CustomLink component

# Search for external URL handling logic in CustomLink
rg -t tsx -t ts "isExternal|external|target=\"_blank\"|rel=\"noopener" frontend/src/components/CustomLink

Length of output: 132


Script:

#!/bin/bash
# First, find the CustomLink component file
fd CustomLink.tsx frontend/src/components

# If not found with .tsx, try other extensions
fd CustomLink frontend/src/components

# Once found, examine its contents
find frontend/src/components -name "CustomLink*" -type f -exec cat {} \;

Length of output: 724

frontend/src/components/Earn/TabSection/JurorTabContent/EnterCourtSection.tsx (2)

17-21: LGTM! Clean implementation of CustomLink.

The CustomLink implementation follows the established pattern in the refactor:

  • Correctly wraps the Button component
  • Properly passes the href and className props
  • Removes unnecessary target/rel attributes as they're handled by CustomLink

6-6: Verify the CustomLink component implementation.

Let's ensure the CustomLink component exists and handles external links correctly.

✅ Verification successful

CustomLink component implementation verified successfully

The component exists and correctly handles both internal and external links with proper security attributes.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify CustomLink component implementation
# Check if CustomLink exists and examine its implementation
ast-grep --pattern 'export $_ function CustomLink' || ast-grep --pattern 'export $_ const CustomLink'

# Check for any potential issues with external link handling
rg -A 10 "CustomLink" "frontend/src/components/CustomLink"

Length of output: 184


Script:

#!/bin/bash
# Find files containing CustomLink
echo "=== Files containing CustomLink ==="
rg -l "CustomLink"

echo -e "\n=== CustomLink Implementation ==="
# Search for component definition
ast-grep --pattern 'const CustomLink = $_' || ast-grep --pattern 'function CustomLink($_)'

echo -e "\n=== Import statements for CustomLink ==="
# Check how CustomLink is being imported
rg "import.*CustomLink"

Length of output: 5657


Script:

#!/bin/bash
# Examine CustomLink implementation
echo "=== CustomLink Component Implementation ==="
cat frontend/src/components/CustomLink.tsx

# Check if there are any related tests
echo -e "\n=== CustomLink Tests ==="
find . -name "CustomLink.test.tsx" -o -name "CustomLink.spec.tsx"

Length of output: 755

frontend/src/components/ResearchDevelopment/TabSection/FellowshipTabContent/Testimonials/TestimonialCard.tsx (1)

Line range hint 7-16: LGTM! Clean implementation of CustomLink.

The CustomLink usage here is correct and straightforward.

frontend/src/components/Community/CommunityCard.tsx (1)

Line range hint 5-23: Verify external URL handling in CustomLink component.

The removal of explicit target and rel attributes requires verification that CustomLink properly handles external URLs with appropriate security attributes.

✅ Verification successful

CustomLink properly handles external URL security

The CustomLink component automatically adds appropriate security attributes (target="_blank" and rel="noopener noreferrer") for external URLs, making the current implementation secure and following best practices.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify CustomLink implementation and usage
# Check CustomLink implementation
echo "Checking CustomLink implementation for external URL handling..."
rg -A 10 "const CustomLink.*=.*{" frontend/src/components/CustomLink.tsx

# Check if the url prop in Community type contains external URLs
echo "Checking Community type definition..."
rg "type.*Community.*{" -A 10

Length of output: 536


Script:

#!/bin/bash
# Check CustomLink implementation
echo "=== CustomLink Implementation ==="
ast-grep --pattern 'const CustomLink = $_' frontend/src/components/CustomLink.tsx

# Check Community type definition
echo -e "\n=== Community Type Definition ==="
ast-grep --pattern 'type Community = $_'

Length of output: 788


Script:

#!/bin/bash
# Try different patterns to find CustomLink
echo "=== Searching CustomLink with ripgrep ==="
rg -l "CustomLink" frontend/src/components/

echo -e "\n=== CustomLink file content ==="
cat frontend/src/components/CustomLink.tsx

Length of output: 2489

frontend/src/components/ForBuilders/UseCasesSection/DAOSection/LearnMore.tsx (1)

Line range hint 15-29: LGTM! Implementation follows the established pattern.

The CustomLink implementation maintains the required functionality while following the consistent pattern across the codebase.

frontend/src/components/ExternalLink.tsx (1)

Line range hint 17-29: Ensure secure handling of external links.

This component is specifically designed for external links, making it crucial to verify that appropriate security attributes are applied.

✅ Verification successful

External links are properly secured ✅

The CustomLink component, which is used by ExternalLink, automatically applies appropriate security attributes (target="_blank" and rel="noopener noreferrer") for external URLs.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify security attributes for external links
# Check ExternalLink usage patterns
echo "Checking ExternalLink usage..."
rg -l "ExternalLink" frontend/src/

# Verify CustomLink implementation for external URLs
echo "Checking CustomLink external URL handling..."
rg "isExternal.*=.*" -A 5 frontend/src/components/CustomLink.tsx

Length of output: 1819


Script:

#!/bin/bash
# Check full CustomLink implementation
echo "Checking CustomLink implementation..."
cat frontend/src/components/CustomLink.tsx

# Check if there are any other link components that might be used
echo -e "\nChecking for other link components..."
fd -e tsx -e ts -x grep -l "target=\"_blank\"" {} \;

Length of output: 859

frontend/src/components/PNKToken/BuySection/FeaturedExchange.tsx (1)

Line range hint 13-26: Critical: Verify secure handling of exchange URLs.

Exchange links require careful security consideration as they direct users to external trading platforms. Ensure that:

  1. CustomLink applies appropriate security attributes for external URLs
  2. Users are properly informed when leaving the site
✅ Verification successful

Exchange URLs are properly secured through CustomLink component

The CustomLink component automatically applies security best practices for external URLs:

  • Detects external URLs using proper validation
  • Applies target="_blank" and rel="noopener noreferrer" attributes
  • Consistently handles all exchange URLs securely
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify exchange URL handling
# Check exchange URL patterns
echo "Checking exchange URL patterns..."
rg "exchange.*url" frontend/src/

# Verify if CustomLink implements user warnings for external URLs
echo "Checking CustomLink external URL warnings..."
rg "isExternal.*warning" frontend/src/components/CustomLink.tsx

Length of output: 725


Script:

#!/bin/bash
# Check CustomLink implementation and external URL handling
echo "Checking CustomLink implementation..."
ast-grep --pattern 'const CustomLink = $_' frontend/src/components/CustomLink.tsx

echo "Searching for external URL patterns..."
rg "rel.*noopener|rel.*noreferrer|target.*_blank" frontend/src/components/

Length of output: 686


Script:

#!/bin/bash
# Check CustomLink's conditional logic for external URLs
echo "Checking CustomLink's external URL handling..."
rg -A 5 "isExternal|href" frontend/src/components/CustomLink.tsx

Length of output: 527

frontend/src/components/LearnMore.tsx (2)

8-8: LGTM! Import statement is correctly placed.

The relative import path for CustomLink is appropriate given the component location.


28-32: LGTM! CustomLink implementation looks correct.

The CustomLink properly wraps the Button component while maintaining the href functionality.

frontend/src/components/BrandAssets/Hero.tsx (2)

8-8: LGTM! Import statement is correctly placed.

The relative import path for CustomLink is appropriate given the component location.


21-25: Verify external link handling in CustomLink.

The removal of target="_blank" and rel="noopener noreferrer" suggests that CustomLink now handles external links internally.

Let's verify the CustomLink implementation:

✅ Verification successful

CustomLink correctly handles external link security attributes

The CustomLink component automatically adds target="_blank" and rel="noopener noreferrer" for external URLs (starting with http:// or https://), making the removal of these attributes from individual usage sites correct and maintainable.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify CustomLink's external link handling

# Search for the CustomLink implementation
ast-grep --pattern 'export default function CustomLink({ href, $$$}) {
  $$$
}'

# Look for external link handling logic
rg -A 10 "isExternal|target.*_blank|rel.*noopener"

Length of output: 2390

frontend/src/components/CtaBox.tsx (2)

8-8: LGTM! Import statement is correctly placed.

The relative import path for CustomLink is appropriate given the component location.


41-45: LGTM! CustomLink implementation looks correct.

The CustomLink properly wraps the Button component while maintaining the href functionality and button styling.

frontend/src/components/BrandAssets/LogosPackageSection.tsx (2)

19-25: LGTM! CustomLink implementation looks correct.

The CustomLink properly wraps the Button component while maintaining the href functionality.


4-5: Verify the distinction between CustomLink and ExternalLink components.

The file imports both CustomLink and ExternalLink components. We should verify their distinct purposes and ensure they're being used appropriately.

Let's analyze both components:

✅ Verification successful

The distinction between CustomLink and ExternalLink components is correct and follows the codebase patterns

The usage is consistent with the rest of the codebase where:

  • CustomLink is used for internal navigation
  • ExternalLink (which builds upon CustomLink) is specifically for external URLs
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Compare CustomLink and ExternalLink implementations

# Search for both component implementations
echo "=== CustomLink Implementation ==="
ast-grep --pattern 'export default function CustomLink({ $$$}) {
  $$$
}'

echo "=== ExternalLink Implementation ==="
ast-grep --pattern 'export default function ExternalLink({ $$$}) {
  $$$
}'

# Look for usage patterns
echo "=== Usage Patterns ==="
rg -A 5 "CustomLink|ExternalLink" --type tsx

Length of output: 441


Script:

#!/bin/bash
# Search for component implementations with multiple patterns
echo "=== CustomLink Implementation ==="
ast-grep --pattern 'const CustomLink = $$$'
ast-grep --pattern 'function CustomLink$$$'
ast-grep --pattern 'interface CustomLinkProps'

echo -e "\n=== ExternalLink Implementation ==="
ast-grep --pattern 'const ExternalLink = $$$'
ast-grep --pattern 'function ExternalLink$$$'
ast-grep --pattern 'interface ExternalLinkProps'

echo -e "\n=== Usage Patterns ==="
rg -A 5 "CustomLink|ExternalLink" --type ts --type typescript --type tsx

# Search for potential test files
echo -e "\n=== Test Files ==="
fd -e test.tsx -e test.ts -e spec.tsx -e spec.ts | grep -i "customlink\|externallink"

Length of output: 763


Script:

#!/bin/bash
# First locate the component files
echo "=== Locating Component Files ==="
fd -t f "CustomLink|ExternalLink" 

# If files exist, examine their content
echo -e "\n=== Component Contents ==="
echo "CustomLink content:"
find . -type f -name "CustomLink.tsx" -o -name "CustomLink.ts" -exec cat {} \;
echo -e "\nExternalLink content:"
find . -type f -name "ExternalLink.tsx" -o -name "ExternalLink.ts" -exec cat {} \;

# Try a broader search for imports
echo -e "\n=== Import Statements ==="
rg "import.*CustomLink|import.*ExternalLink" --type-add 'tsx:*.{tsx,ts}' --type tsx

Length of output: 6581

frontend/src/components/PNKToken/Hero.tsx (1)

26-30: LGTM! Clean replacement of Link with CustomLink.

The CustomLink implementation correctly wraps the Button component while maintaining the required href prop.

frontend/src/components/Community/hero.tsx (1)

25-29: LGTM! Clean implementation in the map function.

The CustomLink correctly wraps each Button while maintaining both key and href props.

frontend/src/components/Earn/TabSection/JurorTabContent/CourtsSection.tsx (1)

Line range hint 32-42: LGTM! Verify hover states remain functional.

The CustomLink implementation looks good. Since the button uses a gradient border, please verify that hover states and interactions remain functional with the CustomLink wrapper.

frontend/src/components/ResearchDevelopment/TabSection/ResearchTabContent/KlerosBook.tsx (1)

38-40: LGTM! Clean implementation with proper props.

The CustomLink correctly wraps each Button while maintaining key and href props. The className for text color is preserved.

frontend/src/components/Cooperative/hero.tsx (2)

9-10: LGTM! Import statement is correctly placed.

The CustomLink import follows the project's import organization pattern.


26-30: Verify external link handling in CustomLink component.

The removal of explicit target and rel attributes suggests that CustomLink handles external links internally. Please ensure that CustomLink properly manages external links with appropriate security attributes.

✅ Verification successful

External link handling in CustomLink component is properly implemented

The CustomLink component automatically adds appropriate security attributes (target="_blank" and rel="noopener noreferrer") for external links. The removal of explicit attributes is correct as they are handled internally by the component.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for CustomLink implementation to verify external link handling
ast-grep --pattern 'export default function CustomLink' -l typescript

Length of output: 416


Script:

#!/bin/bash
# Find files containing CustomLink
echo "=== Files containing CustomLink ==="
fd -e tsx -e ts | xargs rg "CustomLink" -l

echo -e "\n=== CustomLink Implementation ==="
# Search for different export patterns and implementation
rg "CustomLink.*=|export.*CustomLink" -A 10

Length of output: 27083

frontend/src/app/home/components/LearnPosts.tsx (1)

36-41: LGTM! CustomLink implementation is clean and consistent.

The component properly maintains text styling while providing link functionality.

frontend/src/app/for-lawyers/components/Hero.tsx (1)

27-31: LGTM! CustomLink implementation follows consistent pattern.

The component maintains the same structure as other Hero components, properly wrapping Button elements.

frontend/src/components/ForBuilders/Hero.tsx (1)

22-26: LGTM! Button wrapping follows consistent pattern.

The CustomLink implementation for the button follows the established pattern across Hero components.

frontend/src/components/ResearchDevelopment/Hero.tsx (1)

8-8: Verify handling of external links in CustomLink component.

The removal of target and rel attributes during the migration from Next.js Link to CustomLink could affect security and user experience if the links point to external URLs.

Let's verify the implementation of CustomLink component:

Also applies to: 27-31

✅ Verification successful

External links are properly handled by CustomLink component

The CustomLink component automatically adds target="_blank" and rel="noopener noreferrer" attributes for external URLs, making the removal of these attributes from Hero.tsx safe. Additionally, the arrowLink section uses a dedicated ExternalLink component for external links.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check CustomLink implementation and usage
# Expected: CustomLink should handle external links securely

# Check CustomLink implementation
echo "Checking CustomLink implementation..."
rg -A 10 "export.*CustomLink" frontend/src/components/CustomLink.tsx

# Check if any of the button links are external
echo "Checking for external URLs in button links..."
ast-grep --pattern 'buttons.map((button) => { $$$  button.link.url $$$ })'

Length of output: 360


Script:

#!/bin/bash
# Find CustomLink file
echo "Locating CustomLink file..."
fd CustomLink

# Check complete implementation of CustomLink
echo -e "\nChecking CustomLink content..."
cat frontend/src/components/CustomLink.tsx

# Check Hero.tsx usage context
echo -e "\nChecking Hero.tsx usage context..."
cat frontend/src/components/ResearchDevelopment/Hero.tsx

Length of output: 2477

frontend/src/components/Navbar/AppsDropdownContent/Card.tsx (1)

4-4: LGTM! Clean replacement of Link with CustomLink.

The implementation maintains all necessary props and styling classes while transitioning to the new CustomLink component.

However, let's verify that CustomLink properly handles external URLs from the solution data.

Also applies to: 24-68

✅ Verification successful

External URL handling is properly implemented

CustomLink automatically adds appropriate security attributes (target="_blank", rel="noopener noreferrer") for external URLs, making the replacement of Link with CustomLink a safe improvement.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if any solution URLs are external links
rg -l "url.*https?://" --type ts --type tsx

Length of output: 73


Script:

#!/bin/bash
# Search for URL patterns in TypeScript files
rg -l "url.*https?://" . --type typescript

# Check Card component's URL handling
ast-grep --pattern 'const Card = ({ solution }: CardProps) {
  $$$
  url $$$
  $$$
}'

# Also check the CardProps type definition
ast-grep --pattern 'type CardProps = {
  $$$
  url: $_
  $$$
}'

Length of output: 233


Script:

#!/bin/bash
# Find and search typescript files for URL patterns
fd -e ts -e tsx | xargs rg "url.*https?://"

# Look for URL handling in Card component
rg -A 5 "solution.*url" frontend/src/components/Navbar/AppsDropdownContent/Card.tsx

# Check CustomLink implementation
rg -A 5 "CustomLink.*href" frontend/src/components/CustomLink.tsx

Length of output: 812

frontend/src/components/Navbar/AppsDropdownContent/index.tsx (1)

5-5: LGTM! Clean implementation of CustomLink for arrow link.

The replacement maintains the existing styling and structure while transitioning to CustomLink.

Also applies to: 54-66

frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/HowKlerosSolvesIt.tsx (1)

6-6: LGTM! Clean implementation of CustomLink for partner links.

The replacement maintains hover effects and image wrapping functionality.

Since these are partner links, let's verify proper handling of external URLs:

Also applies to: 44-56

✅ Verification successful

External URLs are properly handled in partner links

The CustomLink component correctly handles external URLs by:

  • Automatically detecting http/https URLs
  • Adding proper security attributes (target="_blank" and rel="noopener noreferrer")
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check partner URL patterns in the codebase
ast-grep --pattern 'partners.map((partner) => { $$$
  href={partner?.url}
  $$$
})'

Length of output: 85


Script:

#!/bin/bash
# Check partner type definitions and URL handling
rg -A 2 "type.*Partner.*=.*{" 

# Find CustomLink implementation and URL handling
ast-grep --pattern 'const CustomLink = ({ $$$, href, $$$}) => {'

# Check URL usage in this specific file
cat frontend/src/components/ForBuilders/UseCasesSection/DAOSection/KeyChallenges/HowKlerosSolvesIt.tsx

Length of output: 2406


Script:

#!/bin/bash
# Find CustomLink implementation
rg -l "CustomLink" frontend/src/components/
cat frontend/src/components/CustomLink.tsx

Length of output: 2317

frontend/src/components/Footer.tsx (2)

10-11: LGTM! Clean implementation of CustomLink for footer links.

The replacement maintains hover effects and properly handles both section and social media links.

Let's verify proper handling of external URLs in the footer:

Also applies to: 30-36, 44-46

✅ Verification successful

External URL handling in CustomLink is properly implemented

The CustomLink component correctly detects external URLs and adds appropriate security attributes (target="_blank" and rel="noopener noreferrer"), while maintaining normal Next.js Link behavior for internal routes.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for external URLs in footer data
rg -A 5 "footerSocialsSection|footerLinksSection" --type ts --type tsx

# Verify CustomLink implementation
ast-grep --pattern 'CustomLink {
  $$$
  href={$_}
  $$$
}'

Length of output: 162


Script:

#!/bin/bash
# Search for footer data and sections
rg -t tsx -t ts "footerSocials|footerLinks" -A 5

# Check CustomLink implementation
ast-grep --pattern '<CustomLink $$$href={$_}$$$>'

# Find footer data structure
rg -t tsx -t ts "const.*footer.*=.*\[" -A 10

Length of output: 205


Script:

#!/bin/bash
# Find and check Footer component content
find . -type f -name "Footer.tsx" -exec cat {} \;

# Find and check CustomLink implementation
find . -type f -name "CustomLink.tsx" -exec cat {} \;

Length of output: 2847


4-4: Verify CustomLink implementation for security.

Since this is a widespread refactor replacing Next.js Link with CustomLink, let's verify the CustomLink implementation:

✅ Verification successful

CustomLink implementation is secure and properly handles external links

The CustomLink component automatically adds required security attributes (rel="noopener noreferrer") for external URLs, correctly implementing security best practices for external links.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Find and examine CustomLink implementation
fd -e tsx -e ts "CustomLink" src/components

# Check if CustomLink properly handles:
# 1. External vs internal URL detection
# 2. Security attributes (rel="noopener noreferrer") for external links
ast-grep --pattern 'export $_ CustomLink = ({ href, $_ }) => {
  $$$
}'

Length of output: 219


Script:

#!/bin/bash
# First locate the CustomLink component file
fd CustomLink

# Backup search with ripgrep to find CustomLink definition
rg "export.*CustomLink.*=.*{.*href" -A 10

# Also check the frontend directory structure
ls frontend/src/components

Length of output: 566


Script:

#!/bin/bash
# View CustomLink implementation
cat frontend/src/components/CustomLink.tsx

# Check ExternalLink implementation for context
cat frontend/src/components/ExternalLink.tsx

# Look for CustomLink usage patterns
rg "CustomLink" frontend/src/components -l

Length of output: 3184

frontend/src/app/home/components/TrustedBy.tsx (2)

6-6: LGTM! Import statement is correctly placed.

The CustomLink import follows the project's import organization pattern.


36-44: Verify external link handling in CustomLink component.

The institutions section likely contains external links. Need to ensure CustomLink properly handles external URLs with appropriate security attributes.

Let's verify the CustomLink implementation:

✅ Verification successful

External link handling in CustomLink component is properly implemented

The CustomLink component correctly handles external URLs by adding appropriate security attributes (target="_blank" and rel="noopener noreferrer") for external links. The implementation is secure and follows best practices.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check CustomLink implementation for external link handling
# Expected: Find CustomLink component and verify it adds target="_blank" and rel="noopener noreferrer" for external URLs

# Search for CustomLink component implementation
echo "Searching for CustomLink implementation..."
ast-grep --pattern 'export default function CustomLink' -l typescript

# Check if CustomLink handles external URLs
echo "Checking external URL handling..."
rg -A 10 "const isExternal = " --type=typescript

Length of output: 674


Script:

#!/bin/bash
# Search for CustomLink component with multiple strategies
echo "Searching for CustomLink component..."
# Look for CustomLink in tsx/ts files
rg -t tsx -t ts "CustomLink" -l

# Try finding component definition
ast-grep --pattern 'function CustomLink' -l
ast-grep --pattern 'const CustomLink =' -l

# Search for external URL handling patterns
echo -e "\nChecking URL handling patterns..."
rg -t tsx -t ts "target=\"_blank\"" -B 5 -A 5
rg -t tsx -t ts "rel=\"noopener" -B 5 -A 5

Length of output: 676


Script:

#!/bin/bash
# Search for CustomLink component implementation
echo "Searching in frontend directory..."
cd frontend && find src -type f -name "*.tsx" -o -name "*.ts" | xargs grep -l "CustomLink"

# Look for component definition with ast-grep
echo -e "\nSearching for component definition..."
ast-grep --lang typescript --pattern 'function CustomLink' src
ast-grep --lang typescript --pattern 'const CustomLink =' src

# Search for external URL handling patterns
echo -e "\nChecking URL handling implementation..."
find src -type f -name "*.tsx" -o -name "*.ts" | xargs grep -A 5 -B 5 "isExternal"
find src -type f -name "*.tsx" -o -name "*.ts" | xargs grep -A 5 -B 5 "target=\"_blank\""

Length of output: 5148

frontend/src/components/Navbar/index.tsx (2)

16-17: LGTM! Import statement follows conventions.

The CustomLink import is correctly placed with other component imports.


80-84: Verify navigation behavior for navbar button.

The navbar button's link behavior should remain consistent with the previous implementation.

Let's check the button's link behavior:

✅ Verification successful

Navigation behavior for navbar button is correctly implemented

The current implementation maintains consistency with both:

  • The previous navbar button implementation (desktop and mobile views)
  • The established pattern used throughout the codebase for navigation buttons
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify navbar button link configuration
# Expected: Find previous implementation to compare behavior

# Search for previous navbar button implementation
echo "Searching for previous navbar button implementation..."
git log -p -- "frontend/src/components/Navbar/index.tsx" | rg -B 5 -A 5 "navbarButton.*Link"

Length of output: 118


Script:

#!/bin/bash
# Search for CustomLink component definition and usage
echo "Searching for CustomLink component..."
rg -A 5 "export.*CustomLink" --type typescript

# Search for navbarButton type/interface
echo -e "\nSearching for navbarButton type..."
rg -A 3 "type.*navbarButton|interface.*navbarButton" --type typescript

# Search for Navbar component implementation
echo -e "\nSearching for Navbar component implementation..."
ast-grep --pattern 'const Navbar = $_: React.FC<$_> = ($_) => {
  $$$
}'

Length of output: 549


Script:

#!/bin/bash
# Search for CustomLink component definition and usage
echo "Searching for CustomLink component..."
rg -A 5 "export.*CustomLink" --glob "*.{ts,tsx}"

# Search for navbarButton type/interface
echo -e "\nSearching for navbarButton type..."
rg -A 3 "type.*navbarButton|interface.*navbarButton" --glob "*.{ts,tsx}"

# Find all files containing CustomLink usage
echo -e "\nSearching for CustomLink usage..."
rg -A 2 "<CustomLink" --glob "*.{ts,tsx}"

# Search for Navbar component implementation
echo -e "\nSearching for Navbar component implementation..."
rg -B 5 -A 10 "const Navbar.*=.*{" --glob "*.{ts,tsx}"

Length of output: 12072

frontend/src/components/Navbar/ResourcesDropdownContent/index.tsx (3)

4-4: LGTM! Import statement is properly placed.

The CustomLink import follows the project's import organization.


Line range hint 66-77: Verify social links security attributes.

Social links are typically external. Ensure proper security measures are maintained.

Let's check the social links implementation:

✅ Verification successful

Security attributes for social links are properly implemented

The CustomLink component automatically adds appropriate security attributes (target="_blank" and rel="noopener noreferrer") for all external links, including social links. This is handled consistently at the component level.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify social links security configuration
# Expected: Find social links implementation and security attributes

# Search for social links patterns
echo "Checking social links patterns..."
rg -B 2 -A 2 "socials.*map.*CustomLink" --type=typescript

Length of output: 171


Script:

#!/bin/bash
# Search for CustomLink component implementation and social links
echo "Searching for CustomLink component..."
rg -B 5 -A 5 "export.*CustomLink"

echo "\nSearching for social links configuration..."
rg -B 5 -A 5 "social.*url"

echo "\nSearching for social links mapping..."
fd . -e tsx -e ts -e jsx -e js | xargs rg -l "socials.*map"

Length of output: 3040


Script:

#!/bin/bash
# Get full CustomLink component implementation
echo "Getting CustomLink implementation..."
cat frontend/src/components/CustomLink.tsx

echo "\nChecking for any security-related configurations..."
rg -B 2 -A 2 "rel=|noopener|noreferrer|target=" frontend/src/components/CustomLink.tsx

Length of output: 951


51-51: Verify resource links behavior.

Resource links might be external. Ensure CustomLink maintains appropriate security attributes.

Let's check the resource links configuration:

✅ Verification successful

CustomLink component properly handles external resource links

The CustomLink component automatically applies appropriate security attributes (target="_blank" and rel="noopener noreferrer") for external URLs through the isExternal() function check. This implementation follows security best practices for external links.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify resource links configuration
# Expected: Find link patterns and security attributes

# Search for resource link patterns
echo "Checking resource link patterns..."
rg -B 2 -A 2 "section\.links.*map" --type=typescript

Length of output: 168


Script:

#!/bin/bash
# Find CustomLink component implementation
echo "Searching for CustomLink component..."
ast-grep --pattern 'const CustomLink = $_' 

# Search for resource links configuration with correct extensions
echo -e "\nChecking resource links configuration..."
rg -t ts -t tsx -t js -t jsx -B 2 -A 2 "links.*map"

# Find any security-related attributes in CustomLink usage
echo -e "\nChecking CustomLink security attributes..."
rg -t ts -t tsx -t js -t jsx "CustomLink.*rel=|CustomLink.*target="

Length of output: 507


Script:

#!/bin/bash
# Find CustomLink component implementation
echo "Searching for CustomLink component..."
rg "export.*CustomLink|const CustomLink" -A 5

# Search for resource links configuration
echo -e "\nChecking resource links configuration..."
rg "const.*links.*=.*\[" -A 5

# Find any security-related attributes in links
echo -e "\nChecking link security attributes..."
rg "target.*_blank|rel.*noopener|rel.*noreferrer"

Length of output: 1272

frontend/src/components/Navbar/MobileMenu.tsx (2)

19-20: LGTM! Import statement follows conventions.

The CustomLink import is properly placed with other component imports.


106-110: Ensure consistent behavior between mobile and desktop navigation.

The mobile navbar button should maintain the same behavior as its desktop counterpart.

Let's verify the consistency:

Copy link
Collaborator

@alcercu alcercu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@alcercu alcercu merged commit 4706207 into master Jan 30, 2025
5 checks passed
@alcercu alcercu deleted the refactor/link-refactor-frontend branch January 30, 2025 11:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants